from datetime import timedelta
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.security import create_access_token
from app.core.config import settings
from app.schemas.user import UserCreate, UserLogin, UserResponse, Token
from app.crud.user import create_user, authenticate_user, get_user_by_username, get_user_by_email
from app.api.deps import get_current_active_user
from app.models.user import User

# 创建API路由器
router = APIRouter()

# 用户注册接口
@router.post("/register", response_model=UserResponse, summary="用户注册", description="创建新用户账户")
def register(user: UserCreate, db: Session = Depends(get_db)):
    """
    用户注册接口
    
    - **username**: 用户名（必填，唯一）
    - **email**: 邮箱地址（必填，唯一）
    - **password**: 密码（必填）
    - **role**: 用户角色（可选，默认为普通用户）
    """
    # 检查用户名是否已存在
    db_user = get_user_by_username(db, username=user.username)
    if db_user:
        raise HTTPException(
            status_code=400,
            detail="用户名已被注册"
        )
    
    # 检查邮箱是否已存在
    db_user = get_user_by_email(db, email=user.email)
    if db_user:
        raise HTTPException(
            status_code=400,
            detail="邮箱已被注册"
        )
    
    # 创建新用户并返回
    return create_user(db=db, user=user)

# 用户登录接口
@router.post("/login", response_model=Token, summary="用户登录", description="用户身份验证并获取访问令牌")
def login(user_credentials: UserLogin, db: Session = Depends(get_db)):
    """
    用户登录接口
    
    - **username**: 用户名
    - **password**: 密码
    
    返回访问令牌，用于后续API调用的身份验证
    """
    # 验证用户凭据
    user = authenticate_user(db, user_credentials.username, user_credentials.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="用户名或密码不正确",
            headers={"WWW-Authenticate": "Bearer"},
        )
    # 设置访问令牌过期时间
    access_token_expires = timedelta(minutes=settings.access_token_expire_minutes)
    # 创建访问令牌
    access_token = create_access_token(
        data={"sub": user.username}, expires_delta=access_token_expires
    )
    # 返回访问令牌和令牌类型
    return {
        "access_token": access_token, 
        "token_type": "bearer", 
        "role": user.role,
        "message": "登录成功"
    }

# 获取当前用户信息接口
@router.get("/me", response_model=UserResponse, summary="获取当前用户信息", description="获取当前已认证用户的详细信息")
def read_users_me(current_user: User = Depends(get_current_active_user)):
    """
    获取当前用户信息接口
    
    需要在请求头中提供有效的访问令牌
    """
    # 返回当前已认证用户的信息
    return current_user